class Solution {
public:
    /**
     * 最大正方形
     * @param matrix char字符型vector<vector<>> 
     * @return int整型
     */
    /*
    dp[i][j]表示以i,j为右下角的且只包含1的正方形的边长最大值
    dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1
    */
    int solve(vector<vector<char> >& matrix) {
        // write code here
        int m=matrix.size();
        int n=matrix[0].size();
        if(m==0||n==0)
            return 0;
        int maxvalue=0;
        vector<vector<int>>dp(m,vector<int>(n,0));
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(matrix[i][j]=='1')
                {   
                    if(i==0||j==0)
                       dp[i][j]=1;
                    else
                    {    
                        dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
                    }
                }
                maxvalue=max(maxvalue,dp[i][j]);
            }
        }
        return maxvalue*maxvalue;
    }
};